home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 46 / Amiga Format CD46 (1999-10-20)(Future Publishing)(GB)[!][issue 1999-12].iso / -serious- / comms / www / urlx / urla.c < prev    next >
C/C++ Source or Header  |  1999-09-06  |  4KB  |  221 lines

  1. /*
  2.  *  Program to extract URL's from AWeb cache data file
  3.  */
  4.  
  5. #include <sys/types.h>
  6. #include <stdio.h>
  7. #include <ctype.h>
  8.  
  9. #define getl_be(a) (  ((u_long)(((u_char *)(a))[3]))        \
  10.                     + ((u_long)(((u_char *)(a))[2]) << 8)   \
  11.                     + ((u_long)(((u_char *)(a))[1]) << 16)  \
  12.                     + ((u_long)(((u_char *)(a))[0]) << 24))
  13.  
  14. FILE *f1_p;
  15. char *blkbuf;
  16.  
  17. static const char PROGVER[] =
  18.   "\0$VER: urla V1.00 ** (c) Jul 99 ** frans";
  19.  
  20. static const char USAGE[] =
  21.   "usage: urla [aweb_history_filename]";
  22.  
  23. void cleanup(void)
  24. {
  25.   if (f1_p)
  26.     fclose(f1_p);
  27.   if (blkbuf)
  28.     free(blkbuf);
  29. }
  30.  
  31. void shutdown(char *msg, ...)
  32. {
  33.   vprintf(msg, (void *)(&msg + 1));
  34.   exit(0);
  35. }
  36.  
  37. void usage(void)
  38. {
  39.   shutdown("%s\n\n%s\n\n", PROGVER + 7, USAGE);
  40. }
  41.  
  42. void *xalloc(long len)
  43. {
  44.   char *p;
  45.   if ((p = (char *)malloc(len)) == 0)
  46.     shutdown("out of memory\n");
  47.   return (void *)p;
  48. }
  49.  
  50. char *ultoa_f(
  51.   unsigned long n,char *buf,int radix,int len,char pre)
  52. {
  53.   char *p = (buf += len);
  54.   *buf = 0;
  55.   do
  56.   {
  57.     *--buf ="0123456789ABCDEF"[n % radix];
  58.   } while((--len) && (n /= radix));
  59.   while(len--)
  60.     *--buf = pre;
  61.   return p;
  62. }
  63.  
  64. hexdump(char *buf, long address, long len)
  65. {
  66.   long c, cnt = 0;
  67.   char obuf[80], *op1, *op2;
  68.  
  69.   while (len != 0)
  70.   {
  71.     if ((cnt & 15) == 0)
  72.     {
  73.       op1 = ultoa_f(address, obuf, 16, 6, '0');
  74.       *op1++ = ':';
  75.       op2 = obuf + 44;
  76.     }
  77.     c = (*buf++) & 0xFF;
  78.     if ((cnt & 3) == 0)
  79.       *op1++ = ' ';
  80.     op1 = ultoa_f(c, op1, 16, 2, '0');
  81.     *op2++ = (c > 31 && c < 127) ? c : '.';
  82.     *op2 = 0;
  83.     cnt++;
  84.     address++;
  85.     len--;
  86.     if ((cnt & 15) == 0 || len == 0)
  87.     {
  88.       while (op1 - obuf < 44)
  89.         *op1++ = ' ';
  90.       printf("%ls\n", obuf);
  91.     }
  92.   }
  93.   return cnt;
  94. }
  95.  
  96. char *getnum(char *s, long *np)
  97. {
  98.   long n, h, sign = 1;
  99.   char c;
  100.   while (*s == ' ' || *s == '\t')
  101.     s++;
  102.   if (*s == '-')
  103.     s++, sign = -1;
  104.   n = 0;
  105.   if (*s == '$' || (*s == '0' && *++s == 'x'))
  106.   {
  107.     s++;
  108.     while (isxdigit(*s))
  109.     {
  110.       c = *s++;
  111.       h = ((c < 58) ? c - 48 : ((c < 96) ? c - 55 : c - 87));
  112.       n = (n << 4) + h;
  113.     }
  114.   }
  115.   else
  116.   {
  117.     while (isdigit(*s))
  118.     {
  119.       h = *s++ - 48;
  120.       n = n * 10 + h;
  121.     }
  122.   }
  123.   *np = n * sign;
  124.   return s;
  125. }
  126.  
  127. int main(int argc, char **argv)
  128. {
  129.   int     i, quiet_f, verbose_f;
  130.   long    f1_len, len, ulen;
  131.   char    *f1_name, *p;
  132.   u_long  second, third;
  133.  
  134.   f1_p     = 0;
  135.   blkbuf   = 0;
  136.   f1_name  = 0;
  137.  
  138.   quiet_f  = verbose_f = 0;
  139.  
  140.   atexit(cleanup);
  141.  
  142.   for (i = 1; i < argc; i++)
  143.   {
  144.     if (*(p = argv[i]) == '-')
  145.     {
  146.       switch (*++p)
  147.       {
  148.       case 'v':
  149.         verbose_f = 1;
  150.         if (*++p == 'v')
  151.           verbose_f = 2;
  152.         break;
  153.       case 'q':
  154.         quiet_f = 1;
  155.         if (*++p == 'q')
  156.           quiet_f = 2;
  157.         break;
  158.       default:
  159.         usage();
  160.       }
  161.     }
  162.     else if (f1_name == 0)
  163.       f1_name = p;
  164.     else
  165.       usage();
  166.   }
  167.   if (f1_name == 0)
  168.     f1_name = "AWCR";
  169.  
  170.   if (!quiet_f)
  171.     printf("%s\n\n", PROGVER + 7);
  172.  
  173.   if ((f1_p = fopen(f1_name, "rb")) == 0)
  174.     shutdown("Couldn't open input file %s\n", f1_name);
  175.  
  176.   fseek(f1_p, 0L, 2);
  177.   f1_len = ftell(f1_p);
  178.   fseek(f1_p, 0L, 0);
  179.  
  180.   if ((len = f1_len) != 0)
  181.     blkbuf = xalloc(f1_len);
  182.  
  183.   if (fread(blkbuf, f1_len, 1, f1_p) != 1)
  184.     shutdown("read error\n");
  185.  
  186.   /*
  187.    *  now whole file is in buffer so scan it
  188.    */
  189.  
  190.   p = blkbuf; p += 4;
  191.  
  192.   second = getl_be(p); p += 4;
  193.   third  = getl_be(p); p += 4;
  194.  
  195.   while (p - blkbuf < len)
  196.   {
  197.     u_long tag, flen;
  198.  
  199.     tag  = getl_be(p); p += 4;
  200.  
  201.     p += 12;
  202.  
  203.     flen = getl_be(p); p += 4;
  204.  
  205.     ulen = getl_be(p); p += 4; ulen &= 0xFFFF;
  206.  
  207.     while (*p++ != 0) ;
  208.  
  209.     while (ulen && *p != 0)
  210.     {
  211.       printf("%c", *p++); ulen--;
  212.     }
  213.     printf("\n");
  214.  
  215.     while (ulen--)
  216.       p++;
  217.   }
  218.  
  219.   exit(0);
  220. }
  221.